/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;
import pe.com.cotelasa.helper.VentaFacturacionPrintHelper;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteFindAddArticulo;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDetalleFacturacion;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaFacturacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.KardexModel;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioProducto;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoFormaPago;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioUnidadMedidaComp;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoFormaPago;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacionPK;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaBoletas")
@Scope("request")
public class MBVentaBoletas extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaBoletas.class);
    @Inject
    private BKVentaFacturacion bkVentaFacturacion;
    @Inject
    private BKVentaDetalleFacturacion bkVentaDetalleFacturacion;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioVentaDetalleFacturacion servicioVentaDetalleFacturacion;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    /*@Inject
     private IServicioUnidadMedidaComp servicioUnidadMedidaComp;
     @Inject
     private IServicioProducto servicioProducto;*/
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioTipoFormaPago servicioTipoFormaPago;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private MBComponenteFindAddArticulo mbComponenteFindAddArticulo;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private KardexModel kardexModel;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioKardex servicioKardex;
    @Autowired
    BKSession session;

    @Override
    public String actualizar() {
        try {

            //bkVentaFacturacion.getVentaFacturacionFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkVentaFacturacion.getIdTipoMoneda()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setFormaPago(servicioTipoFormaPago.conseguirTipoFormaPagoPorId(bkVentaFacturacion.getIdTipoFormaPago()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setVendedor(session.getUsuario().getId());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecModificacion(new Date());
            bkVentaFacturacion.getVentaFacturacionFormulario().setUsrModificacion(session.getUsuario().getUsuario());

            servicioVentaFacturacion.actualizarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
            List<VentaDetalleFacturacion> listaAux = new ArrayList<VentaDetalleFacturacion>();
            for (VentaDetalleFacturacion detalle : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                listaAux.add(detalle);
            }

            servicioVentaFacturacion.eliminarDetalleFactura(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());


            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : listaAux) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
                detalle.setFecCreacion(new Date());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }

            bkVentaFacturacion.setVentaFacturacionSeleccionado(bkVentaFacturacion.getVentaFacturacionFormulario());
            mostrarMensaje("Se actualizó la Boleta satisfactoriamente.");
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
        }
    }

    @Override
    public String guardar() {
        boolean flag = true;
        try {
            flag = servicioVentaFacturacion.esNumeroDocCorrecta(bkVentaFacturacion.getVentaFacturacionFormulario());

            if (flag) {
                mostrarError("El número de Boleta ya ha sido registrado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
            }
            //bkVentaFacturacion.getVentaFacturacionFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkVentaFacturacion.getIdTipoMoneda()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setFormaPago(servicioTipoFormaPago.conseguirTipoFormaPagoPorId(bkVentaFacturacion.getIdTipoFormaPago()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setVendedor(session.getUsuario().getId());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecCreacion(new Date());
            bkVentaFacturacion.getVentaFacturacionFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkVentaFacturacion.getVentaFacturacionFormulario().setNumFactura(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura())));

            ResultadoServicio rs = servicioVentaFacturacion.guardarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
            Integer ID = (Integer) rs.getID();


            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_BOLETA_VENTA);

            Integer numero = Integer.parseInt(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura()) + 1;
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            correlativo.setSerie(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

            if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
            }
            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, ID));
                detalle.setFecCreacion(new Date());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }

            mostrarMensaje("Se guardó la Boleta satisfactoriamente.");

            bkVentaFacturacion.setVentaFacturacionSeleccionado(bkVentaFacturacion.getVentaFacturacionFormulario());
            buscarListarBoletas();
            
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
        }
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteFindAddArticulo.clearObserver();
        mbComponenteFindAddArticulo.addObserver(this);
        //mbComponenteFindAddArticulo.cargaInicial();
        bkVentaFacturacion.setComando(new ComandoActualizar(this));
        try {
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            //bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaFacturacion.setVentaFacturacionFormulario(bkVentaFacturacion.getVentaFacturacionSeleccionado());
            //bkVentaFacturacion.setIdTipoMoneda(servicioVentaFacturacion.obtenerIdMonedaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setIdTipoFormaPago(servicioVentaFacturacion.obtenerIdFormaPagoFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setNumero(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura().concat(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());

            bkVentaDetalleFacturacion.setListaDetalleFacturacion(servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            actualizarEstado();

            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_BOLETAS;
            return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_BOLETAS;
        }
    }

    @Override
    public String nuevo() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteFindAddArticulo.clearObserver();
        mbComponenteFindAddArticulo.addObserver(this);
        //mbComponenteFindAddArticulo.cargaInicial();
        bkVentaFacturacion.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo

            VentaFacturacion documento = new VentaFacturacion();
            documento.setDatosDestina("");
            documento.setDomiPartida("");
            documento.setNOcliente("");
            documento.setGuiaRem("");
            documento.setDomiLlegada("");
            documento.setFechEntrega(new Date());
            documento.setFechDocventa(new Date());
            documento.setFechVencimiento(new Date());
            documento.setTipoCompago(TIPO_DOC_VENTA.BOLETA.getValor());
            documento.setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            documento.setSede(session.getSede());
            List<TipoCambio> lista = (List<TipoCambio>) servicioTipoCambio.listarTipoCambiosPorFiltro(new Date(), new Date());
            if (lista.isEmpty()) {
                mostrarError("Ingresar el Tipo de Cambio del día de hoy");
                return URLPaginacion.Ventas.URL_LISTA_BOLETAS;
            } else {
                documento.setTipoCambio(lista.get(0).getVenta().doubleValue());

            }

            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_BOLETA_VENTA);
            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            correlativo.setIdsede(session.getSede());
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            bkVentaFacturacion.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));

            for (ParametroDetalle param : servicioParametro.listaTipoMotivoGuia()) {

                if (param.getValCadena().equalsIgnoreCase("VENTA")) {
                    documento.setMotTraslado(param.getId());
                }
            }

            bkVentaFacturacion.setVentaFacturacionFormulario(documento);
            //bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            //bkVentaFacturacion.setListaTipoDocumento(new ArrayList<TipoDocumento>(servicioTipoDocumento.listarTipoDocumentoActivos()));
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());

            //bkVentaFacturacion.setIdTipoMotivo(0);
            //bkVentaFacturacion.setIdTipoMoneda(0);



        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_BOLETAS;
        }
        return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
    }

    @Override
    public String ver() {
        try {
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            //bkVentaFacturacion.setListaTipoDocumento(new ArrayList<TipoDocumento>(servicioTipoDocumento.listarTipoDocumentoActivos()));
            //bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaFacturacion.setVentaFacturacionFormulario(bkVentaFacturacion.getVentaFacturacionSeleccionado());
            bkVentaFacturacion.setIdTipoMoneda(servicioVentaFacturacion.obtenerIdMonedaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setIdTipoFormaPago(servicioVentaFacturacion.obtenerIdFormaPagoFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setNumero(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura() + "-" + bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura());
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            actualizarEstado();

            return URLPaginacion.Ventas.URL_FORMULARIO_VER_BOLETAS;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_BOLETAS;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {

        if (object instanceof Cliente) {
            Cliente cliente = (Cliente) object;
            bkVentaFacturacion.getVentaFacturacionFormulario().setCodCliente(cliente);
            bkVentaFacturacion.getVentaFacturacionFormulario().setRuc(cliente.getNumeroDocumento());
            bkVentaFacturacion.getVentaFacturacionFormulario().setRazon(cliente.getRazonSocial());
            bkVentaFacturacion.getVentaFacturacionFormulario().setDireccion(cliente.getDireccionLegal());
        }
        if (object instanceof BKComponenteFindAddArticulo) {


            BKComponenteFindAddArticulo comp = (BKComponenteFindAddArticulo) object;
            VentaDetalleFacturacion detalle = new VentaDetalleFacturacion();
            detalle.setCantidad(comp.getCantidad());
            detalle.setPrecUnitario(comp.getPrecioUnitario());
            detalle.setTotal(detalle.getCantidad() * detalle.getPrecUnitario());
            detalle.setUnidad(comp.getArticuloSeleccionado().getUnidadMedida());
            detalle.setCodarticulo(comp.getArticuloSeleccionado().getArticulo());
            detalle.setDescProducto(comp.getDescripcion());
            detalle.setPartida(comp.getArticuloSeleccionado().getPartidaLote());
            detalle.setDescuento(Double.NaN);
            detalle.setUsrCreacion(session.getUsuario().getUsuario());
            detalle.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            bkVentaDetalleFacturacion.getListaDetalleFacturacion().add(detalle);

            try {
                double total = 0.0;
                double subtotal = 0.0;
                double igv = 0.0;
                for (VentaDetalleFacturacion detallev : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                    total = total + detallev.getTotal();
                }

                igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100;
                subtotal = total - igv;

                bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(subtotal);
                bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(igv);
                bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(total);
                bkVentaFacturacion.getVentaFacturacionFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());
                convertirALetra();
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }


        }

    }

    public String mostrarBoletas() {

        VentaFacturacion documento = new VentaFacturacion();
        documento.setRazon("");
        documento.setRuc("");
        documento.setNumFactura("");
        documento.setSede(session.getSede());
        documento.setTipoCompago(TIPO_DOC_VENTA.BOLETA.getValor());
        bkVentaFacturacion.setBusquedaDel(null);
        bkVentaFacturacion.setBusquedaAl(null);
        documento.setFormaPago(new TipoFormaPago(0));
        bkVentaFacturacion.setListaFacturas(null);
        bkVentaFacturacion.setVentaFacturacionBusqueda(documento);
        return URLPaginacion.Ventas.URL_LISTA_BOLETAS;
    }

    public void buscarListarBoletas() {
        try {
            bkVentaFacturacion.setListaFacturas(servicioVentaFacturacion.obtenerVentaFacturacionBusqueda(
                    bkVentaFacturacion.getVentaFacturacionBusqueda(), bkVentaFacturacion.getBusquedaDel(), bkVentaFacturacion.getBusquedaAl()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String anular() {


        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            Collection<Kardex> listaKardex = new ArrayList<Kardex>();

            try {
                listaKardex = servicioKardex.buscarKardexPorVenta(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());
            } catch (ServiceException e) {
                e.printStackTrace();
            }
            try {
                kardexModel.anularKardex(listaKardex, session.getUsuario().getUsuario());
            } catch (ModelExcepcion e) {
                e.printStackTrace();
            }
        }


        bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.ANULADO.getEstado());
        bkVentaFacturacion.getVentaFacturacionFormulario().setUsrModificacion(session.getUsuario().getUsuario());
        bkVentaFacturacion.getVentaFacturacionFormulario().setFecModificacion(new Date());
        servicioVentaFacturacion.actualizarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
        actualizarEstado();

        mostrarMensaje("Se anuló la Boleta satisfactoriamente.");
        return ver();

    }

    public void exportar() {
    }

    public String imprimir() {


        if (!VentaFacturacionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
        }
        try {
            bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecCancelacion(bkVentaFacturacion.getVentaFacturacionFormulario().getFechDocventa());
            if (bkVentaFacturacion.getComando().getNombre().equalsIgnoreCase("Actualizar")) {
                actualizar();
            } else {
                guardar();
            }
            
            if (bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa() == null) {
                mostrarError("Error al guardar el formulario. Verifique que los datos sean correctos.");
                return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
            }
            
            VentaFacturacionPrintHelper.imprimirBoletaVenta(bkVentaFacturacion.getVentaFacturacionFormulario(), bkVentaDetalleFacturacion.getListaDetalleFacturacion(), session.getSede().getRecursoImpresora());

            //actualizarEstado();

            try {
                kardexModel.realizarKardex(bkVentaFacturacion.getVentaFacturacionFormulario(), session.getUsuario().getUsuario());
            } catch (ModelExcepcion e) {
                e.printStackTrace();
            }

            mostrarMensaje("Se lanzó la impresión satisfactoriamente.");
            return ver();


        } catch (PrinterException e) {
            mostrarError("No se pudo realizar la impresión");
            e.printStackTrace();
            return URLPaginacion.Ventas.URL_FORMULARIO_BOLETAS;
        }







       

    }

    public void eliminarDetalle() {

        if (bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado().getVentaDetalleFacturacionPK() == null) {
            Iterator itr = bkVentaDetalleFacturacion.getListaDetalleFacturacion().iterator();
            while (itr.hasNext()) {
                VentaDetalleFacturacion det = (VentaDetalleFacturacion) itr.next();

                if (bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado().getCodarticulo().getId().equals(det.getCodarticulo().getId())) {
                    itr.remove();
                    break;
                }
            }

        } else {
            bkVentaDetalleFacturacion.getListaDetalleFacturacion().remove(bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado());
        }

        try {
            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleFacturacion detallev : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                total = total + detallev.getTotal();
            }

            igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100;
            subtotal = total - igv;

            bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(subtotal);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(igv);
            bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(total);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());
            convertirALetra();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void convertirALetra() {
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta() != null) {
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            DecimalFormat decf = new DecimalFormat("###.##");
            bkVentaFacturacion.getVentaFacturacionFormulario().setValorLetras(valorLetras.Convertir(String.valueOf(decf.format(bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta())), true,
                    bkVentaFacturacion.getVentaFacturacionFormulario().getMoneda().getNombre()));
        }

    }

    public void actualizarEstado() {


        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.ANULADO.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.ANULADO.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(true);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.CREADA.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.CREADA.getColor());
            bkVentaFacturacion.setEditable(false);
            bkVentaFacturacion.setAnulable(false);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.EMITIDO.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.EMITIDO.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(false);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.PAGADA.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.PAGADA.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(true);
        }

        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(false);
        }
    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bkVentaFacturacion.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura())) {
                bkVentaFacturacion.getVentaFacturacionFormulario().setNumFactura(correlativo.getNumero());
            }
        }
    }

    public void marcarInicio(DateSelectEvent event) {
        bkVentaFacturacion.setBusquedaDel(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkVentaFacturacion.setBusquedaAl(event.getDate());
    }

    public boolean estaHabilitado(char estado) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado() || estado == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            return true;
        } else {
            return false;
        }
    }
}
